;int comprimir_buffer ( unsigned char *scr_buf, unsigned int scr_size,	unsigned char **dst_buf, unsigned int *ptr_dst_size,
											;codigo_t **tabla_codigos, unsigned int *long_codificacion )
%include "macros.mac"
%include "generar_tabla_apariciones.asm"
%include "generar_tabla_codigos.asm"
%include "calcular_longitud_codificacion.asm"
%include "generar_codificacion.asm"
extern printf
extern calloc
extern free

;sacar despeus
;~extern generar_tabla_apariciones
;~extern generar_tabla_codigos
;~extern calcular_longitud_codificacion
;~extern generar_codificacion
;;

%define scr_buf ebp +8  				  ;unsigned char *
%define scr_size ebp +12  				;unsigned int
%define dst_buf ebp +16  					;unsigned char **
%define dst_size ebp +20  		;unsigned int *
%define tabla_codigos ebp +24  		;codigo_t **
%define long_codificacion ebp +28 ;unsigned int *
%define ptr_tabla_apariciones ebp -4
%define ptr_tabla_codigos ebp -8
%define tamanio_temp ebp -12
%define sizeof_header 16
global comprimir_buffer

section .text

comprimir_buffer:
	convencion_C 12

	;Genero la tabla de apariciones
	push dword [scr_size]
	push dword [scr_buf]
	call generar_tabla_apariciones
	add esp, 8
	mov [ptr_tabla_apariciones], eax

	;Genero la tabla de codigos
	push eax
	call generar_tabla_codigos
	add esp,4
	mov [ptr_tabla_codigos], eax

	;Calculo la longitud
	push eax
	push dword [ptr_tabla_apariciones]
	call calcular_longitud_codificacion
	add esp, 8
	mov ebx, [long_codificacion]
	mov [ebx], eax

	;me fijo si es modulo 8, hago un and con 7
	mov ebx, eax
	shr ebx, 3
	mov ecx, eax
	and ecx, 7
	cmp ecx, 0
	je mod_8
	inc ebx
	mod_8:
	mov ecx, [dst_size]
	mov [ecx], ebx
	;dst_size = sizeof(oc2_header_t)+(*long_codificacion)+cant_codificaciones;
	mov ecx, [long_codificacion]
	add ebx, [ecx]
	add ebx, sizeof_header
	mov [tamanio_temp], ebx

	;pido memoria
	push 1
	push ebx
	call calloc
	add esp, 8
	cmp eax, 0
	je error_memoria
	mov ecx, [dst_buf]
	mov [ecx], eax

	;Genero la codificacion
	push dword [ptr_tabla_codigos]
	push dword [tamanio_temp]
	push dword [ecx]
	push dword [scr_size]
	push dword [scr_buf]
	call generar_codificacion
	add esp, 20
	cmp eax, 0
	je error_codificacion
	
	mov ecx, [tabla_codigos]
	mov edx, [ptr_tabla_codigos]
	mov [ecx], edx

	push dword [ptr_tabla_apariciones]
	call free
	add esp,4
	
	mov eax, 1
fin_comp_buf:
	convencion_C_fin 12
	ret

error_memoria:
	print_error "No se pudo reservar memoria!"
	jmp fin_comp_buf

error_codificacion:
	print_error "No se pudo codificar!"
	jmp fin_comp_buf
